package com.example.Service.Impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.Service.AccountDetailsService;
import com.example.Service.AccountService;
import com.example.entity.dto.Account;
import com.example.entity.dto.AccountDetails;
import com.example.entity.vo.request.DetailsSaveVO;
import com.example.mapper.AccountDetailsMapper;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

/**
 * 作者:xuSen
 * 日期2025/4/23 14:16
 */
@Service
public class AccountDetailsServiceImpl extends ServiceImpl<AccountDetailsMapper, AccountDetails> implements AccountDetailsService {
    @Resource
    private AccountService accountService;

    /**
     * 根据账户ID查找账户详情
     * 此方法重写自接口或父类，旨在通过账户ID唯一标识来检索账户的详细信息
     *
     * @param id 账户ID，用于唯一标识一个账户
     * @return AccountDetails 返回账户详情对象，包含账户的详细信息如果找不到对应的账户，则返回null
     */
    @Override
    public AccountDetails findAccountDetailsById(int id) {
        return this.getById(id);
    }

    /**
     * 保存或更新用户账户详情
     * 此方法用于处理用户账户详情的保存或更新操作，确保在数据库中账户的唯一性
     * 如果账户不存在或操作针对的是当前账户本身，则进行更新操作
     *
     * @param id 用户账户的数据库ID，用于标识和更新特定的账户记录
     * @param vo 包含用户账户详情的实体对象，用于获取需要保存或更新的账户信息
     * @return 成功保存或更新账户详情返回true，否则返回false
     */
    @Override
    public synchronized boolean saveAccountDetails(int id, DetailsSaveVO vo) {
        // 根据用户名或邮箱查找账户，以确保账户的唯一性
        Account account = accountService.FindByUsernameOrEmail(vo.getUsername());
        // 检查账户是否不存在或是否是当前账户本身
        if(account==null||account.getId()==id){
            // 更新账户的基本信息
            accountService.update()
                    .eq("id",id)
                    .set("username",vo.getUsername())
                    .update();
            // 保存或更新账户详情
            this.saveOrUpdate(new AccountDetails(
                    id,
                    vo.getGender(),
                    vo.getPhone(),
                    vo.getQq(),
                    vo.getWx(),
                    vo.getDesc()
            ));
            return true;
        }
        return false;
    }
}
